home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Archives / ForCLI / 0Utils13.lha / 0Utils / Tackon.c < prev    next >
C/C++ Source or Header  |  1995-03-20  |  4KB  |  179 lines

  1.  
  2. /******************************************************************************
  3.  
  4.     MODULE
  5.     TackOn.c
  6.  
  7.     DESCRIPTION
  8.     Get three strings on Commandline
  9.     a path, a name and a suffix,
  10.     build a filename from these three
  11.     strings and write it to StdOut
  12.  
  13.     NOTES
  14.     Kickstart 2.0+ required
  15.     compiles w/ SAS/C v6.51
  16.  
  17.     BUGS
  18.     there is a strange behaviour if compiled w/ DICE;
  19.     - I cannot say why, but If You do not specify
  20.     each input-slot, You will get a Enforcer-Hits;
  21.     for that reason, I'll distribute Chris' SAS-executable
  22.  
  23.  
  24.     TODO
  25.  
  26.     EXAMPLES
  27.     > tackon xx yy zz
  28.     xx/yy.zz
  29.  
  30.     > tackon xx :yy -zz
  31.     :yy-zz
  32.  
  33.     SEE ALSO
  34.     Suffix, PathPart, FilePart
  35.  
  36.     INDEX
  37.  
  38.     HISTORY
  39.     01-08-93 b_noll created
  40.     20-02-95 b_noll restructured source, removed mstrcpy
  41.     21-02-95 b_noll added version/format-prefix/offset
  42.     27-02-95 b_noll removed an Enforcer Hit (huch!)
  43.     20-03-95 b_noll added args diagnostics
  44.     20-03-95 b_noll fixed crash, if resultstring was too large,
  45.             always returned RETURN_WARN
  46.  
  47.     AUTHOR
  48.     Bernd Noll, Brunnenstrasse 55, D-67661 Kaiserslautern
  49.     b_noll@informatik.uni-kl.de
  50.  
  51. ******************************************************************************/
  52.  
  53. /**************************************
  54.         Includes
  55. **************************************/
  56.  
  57. #ifndef   EXEC_LIBRARIES_H
  58. # include <exec/libraries.h>
  59. #endif /* EXEC_LIBRARIES_H */
  60.  
  61. #ifndef   CLIB_EXEC_PROTOS_H
  62. # include <clib/exec_protos.h>
  63. #endif /* CLIB_EXEC_PROTOS_H */
  64.  
  65. #ifndef   DOS_DOS_H
  66. # include <dos/dos.h>
  67. #endif /* DOS_DOS_H */
  68.  
  69. #ifndef   CLIB_DOS_PROTOS_H
  70. # include <clib/dos_protos.h>
  71. #endif /* CLIB_DOS_PROTOS_H */
  72.  
  73. #include <proto/dos.h>
  74. #include <proto/exec.h>
  75.  
  76. /* ******************** USER INCLUDES ******************** */
  77.  
  78. #include <strings.h>
  79.  
  80. /* ******************** USER INCLUDES ******************** */
  81.  
  82. /**************************************
  83.      Defines & Structures
  84. **************************************/
  85.  
  86. #ifndef ABSEXECBASE
  87. #define ABSEXECBASE ((struct ExecBase **)4L)
  88. #endif
  89.  
  90. struct _arg {
  91. /* ******************** USER FORMAT ******************** */
  92. #define FORMAT "PATH,NAME/A,SUFFIX"
  93.  
  94.     STRPTR path;
  95.     STRPTR name;
  96.     STRPTR suffix;
  97.  
  98. #define isalnum(x) ((((x) <= '9') && ((x >= '0'))) || (((x) <= 'Z') && ((x >= 'A'))) || (((x) <= 'z') && ((x >= 'a'))))
  99. #define BODY(x)      do{ x }while(0)
  100. #define findlast(s)  BODY(char*td=(s);while(*td) ++td; (s)=td;)
  101.  
  102. /* ******************** USER FORMAT ******************** */
  103. }; /* struct _argv */
  104.  
  105. #define MAXPATHLEN 256
  106. #define MAXLINELEN 256
  107.  
  108. #define VERSIONPREFIX    "\0$VER: "
  109. #define VERSIONOFFSET    0
  110. #define FORMATPREFIX    "\0$ARG: "
  111. #define FORMATOFFSET    7
  112.  
  113. /**************************************
  114.         Implementation
  115. **************************************/
  116.  
  117. long _main (void)
  118. {
  119.     const char*     version = VERSIONPREFIX "TackOn 1.2 " __AMIGADATE__ + VERSIONOFFSET;
  120.     long        retval  = RETURN_FAIL;
  121.     struct ExecBase*SysBase = *ABSEXECBASE;
  122.     struct Library* DOSBase;
  123.  
  124.     if (DOSBase = OpenLibrary (DOSNAME, 37)) {
  125.     struct _arg argv = { 0 };
  126.     APTR   args;
  127.     retval = RETURN_ERROR;
  128.     if (args = (void*)ReadArgs(FORMATPREFIX FORMAT + FORMATOFFSET, (LONG*)&argv, NULL)) {
  129. /* ******************** USER BODY ******************** */
  130.  
  131.         char* b2;
  132.         char* buffer;
  133.         if (buffer = AllocMem(MAXPATHLEN, 0)) {
  134.  
  135.         retval    = RETURN_WARN;
  136.         *buffer = 0;
  137.  
  138.         strcpy (buffer, argv.path);
  139.  
  140.         if (AddPart (buffer, argv.name, MAXPATHLEN-1)) {
  141.  
  142.             b2 = buffer;
  143.             while (*b2) ++b2;
  144.             if (argv.suffix) {
  145.             if (isalnum(*argv.suffix)) {
  146.                 *b2   = '.';
  147.                 ++b2;
  148.                 *b2 = 0;
  149.             } /* if */
  150.             } /* if */
  151.  
  152.             if (!PutStr (buffer)) retval = RETURN_OK;
  153.             if (argv.suffix)
  154.             PutStr (argv.suffix);
  155.  
  156.             PutStr ("\n");
  157.         } else {
  158.             //SetIoErr(ERROR_OBJECT_TOO_LARGE);
  159.         } /* addpart */
  160.         FreeMem (buffer, MAXPATHLEN);
  161.         } /* if */
  162.  
  163. /* ******************** USER BODY ******************** */
  164.         FreeArgs (args);
  165.     } /* if */
  166.  
  167.     if (retval > RETURN_WARN)
  168.         PrintFault(IoErr(), "TackOn");
  169.  
  170.     CloseLibrary (DOSBase);
  171.     } /* if */
  172.     return (retval);
  173. } /* _main */
  174.  
  175. /******************************************************************************
  176. *****  END TackOn.c
  177. ******************************************************************************/
  178.  
  179.